(function($) {    
    //缓存所有的已绑定权限码的DOM节点。
	var $permDoms = null;	
	/**
	 * 权限解析对象.
	 */
	ujs.define('perm', 'ujs.exp', {
	    /**
	     * 应用权限码。 
	     */
		parse : function(permData) {		    
		    //perm信息默认存储到 window._data.perm 中.					
			permData = permData || window['_data']['perm'];			
			//强制禁止的权限项.
			var disabledPerms = window['_data']['disabledPerm']; 	
			if(disabledPerms && disabledPerms.length){
				$.each(disabledPerms, function(i, key){
					permData[key] = 0;
				});				
			}			
			//获取权限码相关联的DOM.
			//if(!$permDoms){
			    $permDoms = $('[permCode]');
			//}			
			//解析权限
			var negativeAllPerms = this.getNegativeAllPerms();			
			$permDoms.each(function() {
				with(negativeAllPerms) {
					with(permData) {
						var permValue = false;
						try {
							//若permCode中的表达式未定义，则会抛出异常, 默认permValue为false.
							permValue = eval( $(this).attr('permCode') );
						} catch(e) { }
						$(this)[permValue ? 'show' : 'hide']();
					}
				}
			});
		},
		/**
		 * 获取指定DOM节点上绑定的权限码的值。
		 */
		getDomPermCodeValue : function(domSelector, permData) {
			permData = permData || window['_data']['perm'];
			var permCode = $(domSelector).attr('permCode'),
			    negativeAllPerms = this.getNegativeAllPerms();
			if( permCode ){
    			with(negativeAllPerms){
    				with(permData) {
    					try {
    						return eval( '(' + permCode + ')' );
    					} catch(e) {
    						return false;
    					}
    				}
    			}
			} else {
			    return true;
			}
		},
		/**
		 * 获取指定权限码的值。
		 * 若未指定permCode，则返回所有权限信息。
		 */
		getPermCodeValue : function(permCode){	
		    var permInfo = null;
		    if(window._data && window._data.perm){
		        permInfo = window._data.perm;
		    }
		    return ( permCode && permInfo ) ? permInfo[permCode] : permInfo;       
		},
		/**
		 * 获取多个权限码的'&&'值.
		 */
		and : function(){	
		    var permCodeArr = Object.toArray(arguments).linear();	    
		    if( permCodeArr ){
		        for(var i=0,len=permCodeArr.length; i<len; i++){
                    if( !this.getPermCodeValue(permCodeArr[i]) ){
                        return false;
                    }  
		        } 		        
		        return true;
		    }
		    return false;
		},
		/**
         * 获取多个权限码的'||'值.
         */
		or : function(){ 
            var permCodeArr = Object.toArray(arguments).linear();       
            if( permCodeArr ){
                for(var i=0,len=permCodeArr.length; i<len; i++){
                    if( !!this.getPermCodeValue(permCodeArr[i]) ){
                        return true;
                    }  
                }
            }
            return false;
        },
        /**
         * 判断当前用户是否拥有指定的permCode的权限。
         */
        has : function(permCode){
            return !!this.getPermCodeValue(permCode);
        },
        /**
         * 获取所有的权限项.
         * return @Array.
         */
        getAllPermArr : function(){
            if(!window.ujsConfig || !window.ujsConfig.allPerms){
                return [];
            } else {
                return window.ujsConfig.allPerms;
            }  
        },
        /**
         * 获取所有权限项的禁用状态.
         */
        getNegativeAllPerms : function(){
            var allPerms = this.getAllPermArr(),
                negativeAllPerms = {};
            for(var i=0,len=allPerms.length; i<len; i++){
                negativeAllPerms[allPerms[i]] = 0;
            }
            return negativeAllPerms;
        },
        /**
         * 启用超级用户权限。
         */
		enableSuperUserPerm : function() {
			$('[permCode]').show();
		}
	});	
})($);

//权限码绑定标记示例:
/*
    <span permCode="edit" id="newFolder" title="New Folder" class="icon16" onclick="docAction.addFolder()"></span>
    <span permCode="edit && upload" id="upload" title="Upload Docs" class="icon16" onclick="UploadDialog.create( { dirID : docFolderTree.getCurrentFolderID()} ).show()"></span>
 
    <div id="commentEditor" class="accordionItem" permCode="addCmt || viewCmt">
        <!--Document comment-->
        <h3 class="accordionItemTitle">Comments<span class="commentsCount">(<span id="commentCount"></span>)</span></h3>
        <div class="accordionItemBody">
            <div permCode="addCmt">
                <label class="fieldName">Add a comment</label>
                <textarea id="comment"  class="formInput"></textarea>                               
                <button id="sendComment" class="elipseButton" onclick="docComment.send()">Send</button>
            </div>
            <div permCode="viewCmt">
                <label class="fieldName">Comments</label>
                <div id="commentList"></div>
            </div>
        </div>
    </div>
 */